/*
* jQuery Foundation Top Bar 2.0.1
* http://foundation.zurb.com
* Copyright 2012, ZURB
* Free to use under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*/

/*jslint unparam: true, browser: true, indent: 2 */

; (function ($, window, undefined) {
    'use strict';

    var settings = {
        index: 0,
        initialized: false
    },
    methods = {
        init: function (options) {
            return this.each(function () {
                settings = $.extend(settings, options);
                settings.$w = $(window),
          settings.$topbar = $('nav.top-bar');
                settings.$titlebar = settings.$topbar.children('ul:first');
                var breakpoint = $("<div class='top-bar-js-breakpoint'/>").appendTo("body");
                settings.breakPoint = breakpoint.width();
                breakpoint.remove();

                if (!settings.initialized) {
                    methods.assemble();
                    settings.initialized = true;
                }

                if (!settings.height) {
                    methods.largestUL();
                }

                if (settings.$topbar.parent().hasClass('fixed')) {
                    $('body').css('padding-top', settings.$topbar.outerHeight())
                }

                $('.top-bar .toggle-topbar').die('click.fndtn').live('click.fndtn', function (e) {
                    e.preventDefault();

                    if (methods.breakpoint()) {
                        settings.$topbar.toggleClass('expanded');
                        settings.$topbar.css('min-height', '');
                    }
                });

                // Show the Dropdown Levels on Click
                $('.top-bar .has-dropdown>a').die('click.fndtn').live('click.fndtn', function (e) {
                    if (Modernizr.touch || methods.breakpoint())
                        e.preventDefault();

                    if (methods.breakpoint()) {
                        var $this = $(this),
                  $selectedLi = $this.closest('li'),
                  $nextLevelUl = $selectedLi.children('ul'),
                  $section = $this.closest('section'),
                  $nextLevelUlHeight = 0,
                  $largestUl;

                        settings.index += 1;
                        $selectedLi.addClass('moved');
                        $section.css({ 'left': -(100 * settings.index) + '%' });
                        $section.find('>.name').css({ 'left': 100 * settings.index + '%' });

                        $this.siblings('ul').height(settings.height + settings.$titlebar.outerHeight(true));
                        settings.$topbar.css('min-height', settings.height + settings.$titlebar.outerHeight(true) * 2)
                    }
                });

                $(window).on('resize.fndtn.topbar', function () {
                    if (!methods.breakpoint()) {
                        settings.$topbar.css('min-height', '');
                    }
                });

                // Go up a level on Click
                $('.top-bar .has-dropdown .back').die('click.fndtn').live('click.fndtn', function (e) {
                    e.preventDefault();

                    var $this = $(this),
              $movedLi = $this.closest('li.moved'),
              $section = $this.closest('section'),
              $previousLevelUl = $movedLi.parent();

                    settings.index -= 1;
                    $section.css({ 'left': -(100 * settings.index) + '%' });
                    $section.find('>.name').css({ 'left': 100 * settings.index + '%' });

                    if (settings.index === 0) {
                        settings.$topbar.css('min-height', 0);
                    }

                    setTimeout(function () {
                        $movedLi.removeClass('moved');
                    }, 300);
                });
            });
        },
        breakpoint: function () {
            return settings.$w.width() < settings.breakPoint;
        },
        assemble: function () {
            var $section = settings.$topbar.children('section');

            // Pull element out of the DOM for manipulation
            $section.detach();

            $section.find('.has-dropdown>a').each(function () {
                var $link = $(this),
              $dropdown = $link.siblings('.dropdown'),
              $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li>');

                // Copy link to subnav
                $titleLi.find('h5>a').html($link.html());
                $dropdown.prepend($titleLi);
            });

            // Put element back in the DOM
            $section.appendTo(settings.$topbar);
        },
        largestUL: function () {
            var uls = settings.$topbar.find('section ul ul'),
            largest = uls.first(),
            total = 0;

            uls.each(function () {
                if ($(this).children('li').length > largest.children('li').length) {
                    largest = $(this);
                }
            });

            largest.children('li').each(function () { total += $(this).outerHeight(true); });

            settings.height = total;
        }
    };

    $.fn.foundationTopBar = function (method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.foundationTopBar');
        }
    };

} (jQuery, this));
